package com.jzo2o.health.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.trade.dto.response.NativePayResDTO;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.health.model.domain.Orders;
import com.jzo2o.health.model.domain.OrdersCancelled;
import com.jzo2o.health.model.dto.request.OrdersCancelReqDTO;
import com.jzo2o.health.model.dto.request.OrdersPageQueryReqDTO;
import com.jzo2o.health.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.health.model.dto.response.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author li
 * @since 2024-12-14
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * @param ordersStatus
     * @param sortBy
     * @return java.util.List<com.jzo2o.health.model.dto.response.OrdersResDTO>
     * @description: 用户端滚动分页查询订单
     **/
    List<OrdersResDTO> pageQuery(Integer ordersStatus, Long sortBy);

    /**
     * @param id 订单id
     * @return com.jzo2o.health.model.dto.response.OrdersDetailResDTO
     * @description: 用户端根据id查询订单详情
     **/
    OrdersDetailResDTO detail(Long id);

    /**
     * @param ordersPageQueryReqDTO
     * @return com.jzo2o.common.model.PageResult<com.jzo2o.health.model.dto.response.OrdersResDTO>
     * @description: 管理端分页查询订单
     **/
    PageResult<OrdersResDTO> pageQuery(OrdersPageQueryReqDTO ordersPageQueryReqDTO);

    /**
     * @return com.jzo2o.health.model.dto.response.OrdersCountResDTO
     * @description: 管理端根据状态统计订单数量
     **/
    OrdersCountResDTO countByStatus();

    /**
     * @param id 订单id
     * @return com.jzo2o.health.model.dto.response.AdminOrdersDetailResDTO
     * @description: 管理端根据id查询订单详情
     **/
    AdminOrdersDetailResDTO aggregation(Long id);

    /**
     * @param dto
     * @return com.jzo2o.health.model.dto.response.PlaceOrderResDTO
     * @description: 用户端预约下单
     **/
    PlaceOrderResDTO place(PlaceOrderReqDTO dto);

    /**
     * @param orders
     * @description: 保存订单
     **/
    void saveOrder(Orders orders);

    /**
     * @param dto
     * @description: 已预约人数加1
     **/
    void reserve(PlaceOrderReqDTO dto);

    /**
     * @param id
     * @param tradingChannel
     * @return com.jzo2o.health.model.dto.response.OrdersPayResDTO
     * @description: 用户端生成支付二维码
     **/
    OrdersPayResDTO pay(Long id, PayChannelEnum tradingChannel);

    /**
     * @param id 订单id
     * @param dto 支付接口响应结果
     * @description: 支付成功，更新订单
     **/
    void updateOrders(Long id, NativePayResDTO dto);

    /**
     * @param id
     * @return com.jzo2o.health.model.dto.response.OrdersPayResDTO
     * @description: 查询订单支付结果
     **/
    OrdersPayResDTO payResult(Long id);


    /**
     * @param orderId 订单id
     * @param transactionId 第三方交易号id
     * @param payTime 支付时间
     * @description: 支付成功更新订单表信息
     **/
    void paySuccess(Long orderId, String transactionId, LocalDateTime payTime);

    /**
     * @param dto
     * @description: 用户端取消未支付订单
     **/
    void cancel(OrdersCancelReqDTO dto,boolean isSystem);

    /**
     * @param orders
     * @description: 已预约人数减一
     **/
    void decreReservations(Orders orders);

    /**
     * @param ordersCancelled
     * @description: 保存订单取消数据
     **/
    void saveOrderCancel(OrdersCancelled ordersCancelled);

    /**
     * @param ordersRefund
     * @description: 调用api退款
     **/
    //void orderRefund(OrdersRefund ordersRefund);
}
